package wlxldh357;

public class J06_Conversions {
    //형변환 (conversions)
	
	//서로 다른 자료형을 처리할때 종종 변환이 필요
	
	
	//float avg = (float) tot / 3;
	
	//두 변수가 같은 자료형이라면 대입은 성공적으로 처리
	//같은 유형으로 변환하는 것을 동질성 변환이라 함
	//기본자료형 변환에는 확대/축소 변환이 있음
	//확대 형변환 widening conversion
	//int 형에서 long 형으로의 변환처럼 첫번째 유형에 비해 두번째 유형의 크기가 같거나 클때 발생함
	//확대변환시 정보 손실의 위험은 발생하지 않음
	//단, 정밀도 손실이 간혹 발생할 수 있음
	//확대 변환은 암시적으로 일어남
	//축소 형변환 [narrowing conversion]
	//long 형에서 int 형으로의 변환처럼 첫번째 유형에 비해 두번째 유형의 크기가 작을때 발생함
	//축소 형변환은 확대 형변환과 달리 명시적이어야함
	//괄호안에 변환하려는 유형을 지정(cast 연산자)
	//(float)는 컴파일러에게 float 형으로 변환할 것을 지시함
	//정보 손실이 발생할 수 있기 때문에 유의해야함
	//이것은 프로그램의 결함을 야기함
	
	
	public static void main(String[] args) {
	//동질성 변환[identity conversion]
		int a = 90;
		int b = a;
		
	//확대 형변환
	    long c = a;
	    
	//축소 형변환
	    int d = (int)c;
	
	//축소 형변환으로 인한 정보손실
	    long e = 1234567890123L;
	    int f = (int)e;
	    
	//연산자 우선순위
	    int g = 1;
	    int h = 2;
	    int i = 3;
	    int j = g + h * i;
	//모든 연산자에는 우선순위가 있음
	//가장 높은 우선순위는 () , ++ , --
	    
	    int k = 5;
	    int l = 5;
	    boolean m = k * 5 == l + 20;
	//승격 promotion
	    byte n = 5;
	    
	//byte o = -n; 오류 발생!
	//단항 연산자 - 에 의해  n 변수가 int 형으로 승격
	//문제 해결을 위해 명시적 축소 형변환을 사용하거나 변수를 int 형으로 바꾸면 됨
        byte o = (byte)-n;
        int p = -n;
        
        short q = 100;
        short r = 200;
        
    // short s = q + r;오류 발생!
    //이항 연산자 + 에 의해 q,r 변수가 int 형으로 승격
        short s = (short) (q+r);
        int t = q+r;
        
    //주석 comments
    //프로그램 코드에 덧붙이는 설명문 , 해설
    //컴파일러가 소스를 컴파일할 때 주석은 무시하고 넘어감
    //해당 코드가 제공하는 기능 , 용도 , 의미를 쉽게 파악하도록 하기위해 주석을 다는것은 좋은 습관임
    //자바에서는 2가지 주석 유형 제공 - c, c++ 과 유사
    //전통적인 주석은 /* 와 */사이에 주석을 작성
    //주의) 중첩해서 사용하면 안됨!!
    //한 줄 주석인 // 는 코드 끝에 작성하는 주석
        
    /*이 문장은 주석입니다~ */
    // /*/* */*/처럼 주석을 중첩하면 안됨
    
    //연결 join 연산자 +(concatenate)
    //일반적으로 + 연산자는 두 수를 더하는 기능을 가짐
    //하지만, 문자나 문자열에 + 연산자를 사용하면 앞의 문자와 뒤의 문자를연결(합치는)해 줌
        char u = '가';
        char v = '나';
        
     
	    System.out.println(e);
	    System.out.println(f);
	    System.out.println(u);
	    System.out.println(v);
	    System.out.println(u+v); //승격으로 인해 숫자로 출력
	    System.out.println(""+u+v);
        
	//하지만, 문자에 사용하는  + 연산자로 인한 오버헤드 때문에 StringBuilder클래스를 주로 사용
	
	   
	}

}
